home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / xep / hostc.c < prev    next >
C/C++ Source or Header  |  1997-08-08  |  6KB  |  315 lines

  1.  
  2. static char rcsid[] =
  3.     "$Id: hostc.c,v 1.2 1997/07/09 13:56:50 pvmsrc Exp $";
  4.  
  5. /*
  6.  *         PVM version 3.4:  Parallel Virtual Machine System
  7.  *               University of Tennessee, Knoxville TN.
  8.  *           Oak Ridge National Laboratory, Oak Ridge TN.
  9.  *                   Emory University, Atlanta GA.
  10.  *      Authors:  J. J. Dongarra, G. E. Fagg, M. Fischer
  11.  *          G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
  12.  *         P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
  13.  *                   (C) 1997 All Rights Reserved
  14.  *
  15.  *                              NOTICE
  16.  *
  17.  * Permission to use, copy, modify, and distribute this software and
  18.  * its documentation for any purpose and without fee is hereby granted
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both the copyright notice and this permission notice appear in
  21.  * supporting documentation.
  22.  *
  23.  * Neither the Institutions (Emory University, Oak Ridge National
  24.  * Laboratory, and University of Tennessee) nor the Authors make any
  25.  * representations about the suitability of this software for any
  26.  * purpose.  This software is provided ``as is'' without express or
  27.  * implied warranty.
  28.  *
  29.  * PVM version 3 was funded in part by the U.S. Department of Energy,
  30.  * the National Science Foundation and the State of Tennessee.
  31.  */
  32.  
  33. /*
  34.  *    hostc.c
  35.  *
  36.  *    Local host table cache functions.
  37.  *
  38. $Log: hostc.c,v $
  39.  * Revision 1.2  1997/07/09  13:56:50  pvmsrc
  40.  * Fixed Author Header.
  41.  *
  42.  * Revision 1.1  1996/09/23  22:52:48  pvmsrc
  43.  * Initial revision
  44.  *
  45.  */
  46.  
  47.  
  48. #include <stdio.h>
  49. #ifdef    SYSVSTR
  50. #include <string.h>
  51. #else
  52. #include <strings.h>
  53. #endif
  54. #include <sys/types.h>
  55. #include <sys/time.h>
  56. #ifdef IMA_LINUX
  57. #include <linux/time.h>
  58. #endif
  59. #include <pvm3.h>
  60. #include <../src/bfunc.h>
  61. #include <../src/listmac.h>
  62. #include "myalloc.h"
  63. #include "hostc.h"
  64.  
  65.  
  66. /* static char rcsid[] = "$Id: hostc.c,v 1.2 1997/07/09 13:56:50 pvmsrc Exp $";*/
  67. static struct hostc *curhosts = 0;
  68. static int addtag = -1;
  69. static int deltag = -1;
  70. static int (*addcallback)() = 0;
  71. static int (*delcallback)() = 0;
  72.  
  73.  
  74. static struct hostc *
  75. hc_new()
  76. {
  77.     struct hostc *hp;
  78.  
  79.     if (hp = TALLOC(1, struct hostc, "hd"))
  80.         BZERO(hp, sizeof(struct hostc));
  81.     return hp;
  82. }
  83.  
  84.  
  85. static int
  86. hc_init()
  87. {
  88.     if (curhosts = hc_new())
  89.         curhosts->link = curhosts->rlink = curhosts;
  90.  
  91.     else
  92.         fprintf(stderr, "hc_init() out of memory\n");
  93.     return 0;
  94. }
  95.  
  96.  
  97. static struct hostc *
  98. hc_add(hip)
  99.     struct pvmhostinfo *hip;
  100. {
  101.     struct hostc *hp, *hp2;
  102.  
  103.     /*
  104.     * if we have a delete message tag and it's not this host, notify
  105.     */
  106.  
  107.     if (deltag != -1 && hip->hi_tid != pvm_tidtohost(pvm_mytid()))
  108.         pvm_notify(PvmHostDelete, deltag, 1, &hip->hi_tid);
  109.  
  110.     if (hp = hc_new()) {
  111.         hp->pvmd_tid = hip->hi_tid;
  112.         hp->name = STRALLOC(hip->hi_name);
  113.         hp->alias = STRALLOC(hip->hi_name);
  114.         hp->arch = STRALLOC(hip->hi_arch);
  115.         hp->speed = hip->hi_speed;
  116.         pvm_hostsync(hp->pvmd_tid, (struct timeval *)0, &(hp->delta));
  117.     }
  118.  
  119.     for (hp2 = curhosts->link; hp2 != curhosts; hp2 = hp2->link)
  120.         if (hp->pvmd_tid < hp2->pvmd_tid)
  121.             break;
  122.     LISTPUTBEFORE(hp2, hp, link, rlink);
  123.  
  124.     return hp;
  125. }
  126.  
  127.  
  128. static int
  129. hc_delete(hp)
  130.     struct hostc *hp;
  131. {
  132.     LISTDELETE(hp, link, rlink);
  133.     if (hp->name)
  134.         MY_FREE(hp->name);
  135.     if (hp->arch)
  136.         MY_FREE(hp->arch);
  137.     if (hp->alias)
  138.         MY_FREE(hp->alias);
  139.     MY_FREE(hp);
  140.     return 0;
  141. }
  142.  
  143.  
  144. static struct hostc *
  145. hc_find(tid)
  146. {
  147.     struct hostc *hp;
  148.  
  149.     for (hp = curhosts->link; hp != curhosts; hp = hp->link)
  150.         if (tid <= hp->pvmd_tid)
  151.             break;
  152.     return (tid == hp->pvmd_tid) ? hp : (struct hostc *)0;
  153. }
  154.  
  155.  
  156. /*    host_init()
  157. *
  158. *    Initialize host cache.  Called once at beginning of time.
  159. *    Synchronize to current configuration.
  160. *    Specify message tags to be used for HostAdd and HostDelete notify.
  161. */
  162.  
  163. host_init(atag, dtag, acb, dcb)
  164.     int atag;            /* message tag to use for HostAdd notify or -1 */
  165.     int dtag;            /* tag to use for HostDelete notify or -1 */
  166.     int (*acb)();        /* callback for each host added */
  167.     int (*dcb)();        /* callback for each host deleted */
  168. {
  169.     struct pvmhostinfo *hip;
  170.     int nh;
  171.  
  172.     addtag = atag;
  173.     deltag = dtag;
  174.     addcallback = acb;
  175.     delcallback = dcb;
  176.  
  177.     hc_init();
  178.  
  179.     if (addtag != -1)
  180.         pvm_notify(PvmHostAdd, addtag, -1, (int *)0);
  181.  
  182.     if (!pvm_config(&nh, (int *)0, &hip)) {
  183.         while (nh > 0) {
  184.             nh--;
  185.             hc_add(&hip[nh]);
  186.         }
  187.     }
  188.     return 0;
  189. }
  190.  
  191.  
  192. /*    host_add()
  193. *
  194. *    Called when a HostAdd notify message has been received.
  195. *    The message is in the current receive buffer.
  196. */
  197.  
  198. host_add()
  199. {
  200.     int d = 0;
  201.     int n;
  202.     int *dtids;
  203.     int i, j;
  204.     struct pvmhostinfo *hip;
  205.     int nh;
  206.  
  207.     pvm_upkint(&n, 1, 1);
  208.     if (n < 1 || n > 4096)
  209.         return 0;
  210.     dtids = TALLOC(n, int, "dtid");
  211.     pvm_upkint(dtids, n, 1);
  212.     pvm_freebuf(pvm_getrbuf());
  213.     if (!pvm_config(&nh, (int *)0, &hip)) {
  214.         for (j = n; j-- > 0; )
  215.             for (i = nh; i-- > 0; ) {
  216.                 if (dtids[j] == hip[i].hi_tid) {
  217.                     hc_add(&hip[i]);
  218.                     if (addcallback)
  219.                         addcallback(dtids[j]);
  220.                     d++;
  221.                     break;
  222.                 }
  223.             }
  224.     }
  225.     MY_FREE(dtids);
  226.     return d;
  227. }
  228.  
  229.  
  230. /*    host_delete()
  231. *
  232. *    Called when a HostDelete notify message has been received.
  233. *    The message is in the current receive buffer.
  234. */
  235.  
  236. host_delete()
  237. {
  238.     int tid;
  239.     struct hostc *hp;
  240.     int d = 0;
  241.  
  242.     pvm_upkint(&tid, 1, 1);
  243.     if (tid == pvm_tidtohost(tid) && (hp = hc_find(tid))) {
  244.         if (delcallback)
  245.             delcallback(tid);
  246.         hc_delete(hp);
  247.         d++;
  248.     }
  249.     return d;
  250. }
  251.  
  252.  
  253. struct hostc *
  254. host_findtid(tid)
  255.     int tid;
  256. {
  257.     return hc_find(tid);
  258. }
  259.  
  260.  
  261. struct hostc *
  262. host_findname(name)
  263.     char *name;
  264. {
  265.     struct hostc *hp;
  266.  
  267.     for (hp = curhosts->link; hp != curhosts; hp = hp->link)
  268.         if (!strcmp(name, hp->name))
  269.             return hp;
  270.     return (struct hostc *)0;
  271. }
  272.  
  273.  
  274. struct hostc *
  275. host_next(hp)
  276.     struct hostc *hp;
  277. {
  278.     hp = hp ? hp->link : curhosts->link;
  279.     return (hp == curhosts) ? 0 : hp;
  280. }
  281.  
  282.  
  283. int
  284. host_show()
  285. {
  286.     struct hostc *hp;
  287.     int nh = 0;
  288.     int na = 0;
  289.     int a;
  290.     long mask = 0;
  291.  
  292.     for (hp = 0; hp = host_next(hp); ) {
  293.         nh++;
  294.         a = pvm_archcode(hp->arch);
  295.         if (!(mask & (1 << a))) {
  296.             na++;
  297.             mask |= (1 << a);
  298.         }
  299.     }
  300.     printf("Configuration: %d host%s, %d data format%s\n",
  301.             nh, (nh == 1 ? "" : "s"),
  302.             na, (na == 1 ? "" : "s"));
  303.     printf("     TID       ARCH   SPEED HOSTNAME\n");
  304.     for (hp = 0; hp = host_next(hp); ) {
  305.         printf("%8x %10s %7d %-24s\n",
  306.                 hp->pvmd_tid,
  307.                 hp->arch,
  308.                 hp->speed,
  309.                 hp->name);
  310.     }
  311.     return 0;
  312. }
  313.  
  314.  
  315.